#ifndef USB_PROCESS_LIST_MODEL_H
#define USB_PROCESS_LIST_MODEL_H

#include <QAbstractListModel>
#include <QStringList>
#include <QVector>
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <QCoreApplication>
#include <QDebug>
#include <QMutex>

// 材料数据结构体
struct MaterialData {
    QString materialName;    // 材料名称
    QString material_Color;  // 颜色
    QString material_ID;     // ID
    QString specification;   // 规格型号
    QString cuttingLength;   // 切割长度
    QString leftAngle;       // 左角度
    QString rightAngle;      // 右角度
    QString rawMaterialLength; // 原料长度
    QString remainingLength;  // 剩余长度
    int totalCount;          // 总切割数量
    int processedCount;      // 已加工数量
};


class USB_Process_List_Model : public QAbstractListModel
{
    Q_OBJECT

    Q_PROPERTY(int count READ count WRITE setCount NOTIFY countChanged FINAL)
    Q_PROPERTY(QString currentFile READ currentFile WRITE setCurrentFile NOTIFY currentFileChanged)
    Q_PROPERTY(QStringList fileList READ fileList NOTIFY fileListChanged)
    Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusMessageChanged)


public:

    // 角色定义
    enum Roles {
        MaterialNameRole = Qt::UserRole + 1,
        MaterialColorRole,
        MaterialIDRole,
        SpecificationRole,
        CuttingLengthRole,
        LeftAngleRole,
        RightAngleRole,
        RawMaterialLengthRole,
        RemainingLengthRole,
        TotalCountRole,
        ProcessedCountRole
    };

    // 单例模式
    static USB_Process_List_Model* getInstance(QObject *parent = nullptr);


    // 重写QAbstractListModel方法
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;


    // CSV文件操作
    Q_INVOKABLE bool saveToCsv();          // 保存数据到CSV
    Q_INVOKABLE bool readFromCsv();        // 从CSV读取数据
    Q_INVOKABLE void clearCsvFile();       // 清空CSV文件

    // 数据访问与操作
    Q_INVOKABLE QVariantMap get(int index) const;  // 获取指定索引数据（供QML使用）
    Q_INVOKABLE void addMaterial(const MaterialData &data);  // 添加材料数据
    Q_INVOKABLE void clear();  // 清空所有数据
    Q_INVOKABLE void updateProcessedCount(int index, int count);  // 更新已加工数量
    Q_INVOKABLE void incrementWorkedCount(int index); // 新增：增加已加工数量

    int count() const;
    void setCount(int newCount);
    QString currentFile() const;
    void setCurrentFile(const QString &newCurrentFile);
    QString statusMessage() const;
    QStringList fileList() const;

private:
    USB_Process_List_Model(QObject *parent = nullptr);
    ~USB_Process_List_Model();
    USB_Process_List_Model(const USB_Process_List_Model&)=delete;
    USB_Process_List_Model &operator=(const USB_Process_List_Model)=delete;

    static USB_Process_List_Model* m_instance;  // 单例实例
    static QMutex m_mutex;

    QVector<MaterialData> m_materials;  // 材料数据列表
    QString m_csvFilePath;  // CSV文件路径

    // 辅助方法
    bool parseCsvData(const QString &data);  // 解析CSV数据
    QString getProcessListsPath() const;  // 获取文件扫描路径
    void setStatusMessage(const QString &message);  // 设置状态消息

    int m_count;

    QString m_currentFile;

    QString m_statusMessage;

    QStringList m_fileList;

signals:
    void countChanged();
    void currentFileChanged();
    void statusMessageChanged();
    void fileListChanged();
    void showMessage(const QString &message);
    void dataCleared();  // 数据清空信号
    void modelDataUpdated();  // 模型数据更新信号（通知QML）

public slots:
    void parseSelectedFile();  // 解析选中的文件
    void scanFiles();  // 扫描文件夹中的文件
    Q_INVOKABLE void setMaterialList(const QVector<MaterialData> &materialList);  // 设置材料列表

};

#endif // USB_PROCESS_LIST_MODEL_H
